//
//  Emoticon.swift
//  表情键盘
//
//  Created by waterfoxjie on 15/8/9.
//  Copyright © 2015年 zj. All rights reserved.
//

import UIKit

/**

1、Emoticons.bundle的目录中有一个emoticons.plist文件，packages数组中的每一项字典的id对应的时每一套表情的目录名

2、每一个表情目录下，都有一个info.plist文件，group_name_cn记录表情包的名字，emoticons数组，记录着整套表情的数组

3、表情字典信息：
   
   chs  ： 定义的是发布微博以及网络传输使用的微博传输字符串
   png  ： 在客户端显示的图片名称
   code ： emoji要显示的16进制字符串

*/

// MARK: - 表情包模型
class EmoticonPackage: NSObject {
    
    // MARK: - 定义属性
    // 目录名
    var id : String
    
    // 分组名
    var groupName : String = ""
    
    // 表情数组
    var emoticons : [Emoticon]?
    
    // MARK: - 构造函数
    init(id : String , groupName : String = "") {
        
        // 赋值
        self.id = id
        
        self.groupName = groupName
        
    }
    
    // MARK: - 加载所有表情包
    class func package() -> [EmoticonPackage] {
        
        // 加载emoticons.plist路径
        let path = bundlePath.stringByAppendingPathComponent("emoticons.plist")
        
        // 加载emoticons.plist
        let dict = NSDictionary(contentsOfFile: path)!
        
        // 拿到package数组
        let array = dict["packages"] as! [[String : AnyObject]]
        
        var arrayM = [EmoticonPackage]()
        
        // 添加最近分组
        let package = EmoticonPackage(id: "", groupName: "最近").appendEmptrEmotions()
        
        arrayM.append(package)
        
        // 遍历数组
        for d in array {
        
            // 链式响应
            let package = EmoticonPackage(id: d["id"] as! String).loadEmoticons().appendEmptrEmotions()
            
            arrayM.append(package)
        }
        
        return arrayM
    }
    
    // MARK: - 加载当前对象对应的表情数组
    // Self ：返回Self表示返回本类的对象
    func loadEmoticons() -> Self {
        
        // 获取路径
        let path = EmoticonPackage.bundlePath.stringByAppendingPathComponent(id).stringByAppendingPathComponent("info.plist")
        
        let dict = NSDictionary(contentsOfFile: path)!
        
        // 拿到group_name_cn（分组名称）
        groupName = dict["group_name_cn"] as! String
        
        // 拿到emoticons这个表情数组
        let array = dict["emoticons"] as! [[String : String]]
        
        // 遍历数组
        emoticons = [Emoticon]()
        
        // 计数器
        var index = 0
        
        for d in array {
        
            // 这样就能返回一个id属性的值
            emoticons?.append(Emoticon(id: id, dict: d))
            
            index++
            
            // 当前是第20个按钮时，添加一个删除按钮
            if index == 20 {
            
                emoticons?.append(Emoticon(remove: true))
                
                index = 0
            }
        }
    
        return self
    }
    
    // MARK: - 判断是不是整页显示
    func appendEmptrEmotions() -> Self {
        
        // 判断表情包是否存在
        if emoticons == nil {
        
            // 创建一个
            emoticons = [Emoticon]()
            
        }
    
        let count = emoticons!.count % 21
        
        // count = 0 的时候表示现在是整页，不用添加
        // emoticons?.count == 0 表示当前的表情包是默认表情包，什么都没有，添加空白充当占位符
        if count > 0 || emoticons?.count == 0 {
        
            // 如果不是整页显示的，遍历添加空格
            for _ in count..<20 {
                
                emoticons?.append(Emoticon(remove: false))
            }
            
            // 最后再添加一个删除按钮
            emoticons?.append(Emoticon(remove: true))
        }
        
        return self
    }
    
    // MARK: - 加载Emoticons.bundle的路径
    static let bundlePath = NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent("Emoticons.bundle")
    
    
    override var description : String {
    
        return "\(id) \(groupName) \(emoticons)"
    }


    
}

// MARK: - 表情模型
class Emoticon: NSObject {
    
    // MARK: - 定义属性
    // 给服务器的表情文字
    var chs : String?
    
    // 本地显示的图片文件名
    var png : String?
    
    // emoji中的表情属性（16进制数形式）
    var code : String? {
    
        didSet {
        
            // 扫描器
            let scanner = NSScanner(string: code!)
            
            var value : UInt32 = 0
            
            scanner.scanHexInt(&value)
            
            emoji = String(Character(UnicodeScalar(value)))
        }
    }
    
    // emoji字符串
    var emoji : String?
    
    // 定义一个id属性
    var id : String?
    
    // 图片完整路径（Emoticons.bundle的路径 + id + png）
    var imagePath : String {
        
        // 判断是否是图片表情
        if chs == nil {
        
            return ""
        }
        
        return EmoticonPackage.bundlePath.stringByAppendingPathComponent(id!).stringByAppendingPathComponent(png!)
        
    }
    
    // 定义删除表情的标记
    var removeEmoticon = false
    
    // 构造函数
    init(remove : Bool) {
    
        removeEmoticon = remove
    }
    
    init(id : String , dict : [String : String]) {
        
        self.id = id
    
        super.init()
        
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    override var description : String {
        
        return "\(chs) \(png) \(code)"
    }
    
    
    

}
